package com.dynamic.mybatis.generator;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.dynamic.mybatis.generator.util.ZipUtil;
import com.dynamic.mybatis.generator.vo.GeneratorStrategyVo;
import com.dynamic.mybatis.generator.vo.GeneratorVo;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class GeneratorHelp {


    public static void main(String[] args) {
        GeneratorVo generatorVo = GeneratorVo.test();
        generate(generatorVo);
    }


    public static String generate(GeneratorVo generatorVo) {
        //数据源
        DataSourceConfig dataSourceConfig;
        if (generatorVo.getDataSource().getDataSource() != null) {
            dataSourceConfig = new DataSourceConfig
                    .Builder(generatorVo.getDataSource().getDataSource())
                    .build();
        } else {
            dataSourceConfig = new DataSourceConfig
                    .Builder(generatorVo.getDataSource().getUrl(), generatorVo.getDataSource().getUsername(), generatorVo.getDataSource().getPassword())
                    .build();
        }
        String datTime = new SimpleDateFormat("yyyyMMddHHssmmss").format(new Date());
        String basePath = System.getProperty("user.dir") + File.separator + "generator";
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator(dataSourceConfig);
        String javaBasePath = basePath + File.separator + datTime + File.separator + generatorVo.getJavaRootPath().replace(".", File.separator) + File.separator;
        generatorVo.setOutputDir(javaBasePath);
        // 全局配置
        GlobalConfig.Builder globalConfig = new GlobalConfig.Builder()
                .author(generatorVo.getAuthor())
                .outputDir(generatorVo.getOutputDir());
        if (!generatorVo.isOpen()) {
            globalConfig.disableOpenDir();
        }
        mpg.global(globalConfig.build());

        // 包配置
        PackageConfig.Builder packageConfig = new PackageConfig
                .Builder()
                .parent(Objects.toString(generatorVo.getJavaParent(), ""));
        Map<OutputFile, String> pathInfo = new HashMap<>();
        //设置xml包名
        if (StringUtils.isNotBlank(generatorVo.getXmlRootPath()) && !Objects.equals(generatorVo.getJavaRootPath(), generatorVo.getXmlRootPath())) {
            String xmlPath = basePath + File.separator + datTime + File.separator + (generatorVo.getXmlRootPath().replace(".", File.separator));
            if (generatorVo.getStrategy() != null && generatorVo.getStrategy().getXml() != null && StringUtils.isNotBlank(generatorVo.getStrategy().getXml().getPackageName())) {
                xmlPath += File.separator + generatorVo.getStrategy().getXml().getPackageName();
            }
            pathInfo.put(OutputFile.xml, xmlPath);
        }
        packageConfig.pathInfo(pathInfo);
        //模板配置
        TemplateConfig.Builder templateConfig = new TemplateConfig.Builder();
        // 策略配置
        StrategyConfig.Builder strategy = new StrategyConfig.Builder();

        GeneratorStrategyVo strategyVo = generatorVo.getStrategy();
        if (strategyVo.getController() != null) {
            if (StringUtils.isNotBlank(strategyVo.getController().getFileName())) {
                strategy.controllerBuilder().formatFileName(strategyVo.getController().getFileName());
            }
            if (StringUtils.isNotBlank(strategyVo.getController().getPackageName())) {
                packageConfig.controller(strategyVo.getController().getPackageName());
            }
            if (strategyVo.getController().isDisable()) {
                templateConfig.disable(TemplateType.CONTROLLER);
            }
        }

        if (strategyVo.getService() != null) {
            if (StringUtils.isNotBlank(strategyVo.getService().getFileName())) {
                strategy.serviceBuilder().formatServiceFileName(strategyVo.getService().getFileName());
            } else {
                strategy.serviceBuilder().formatServiceFileName("%Service");
            }
            if (StringUtils.isNotBlank(strategyVo.getService().getPackageName())) {
                packageConfig.service(strategyVo.getService().getPackageName());
            }
            if (strategyVo.getService().isDisable()) {
                templateConfig.disable(TemplateType.SERVICE);
            }
        } else {
            strategy.serviceBuilder().formatServiceFileName("%sService");
        }

        if (strategyVo.getServiceImpl() != null) {
            if (StringUtils.isNotBlank(strategyVo.getServiceImpl().getFileName())) {
                strategy.controllerBuilder().formatFileName(strategyVo.getServiceImpl().getFileName());
            }
            if (StringUtils.isNotBlank(strategyVo.getServiceImpl().getPackageName())) {
                packageConfig.serviceImpl(strategyVo.getServiceImpl().getPackageName());
            }
            if (strategyVo.getServiceImpl().isDisable()) {
                templateConfig.disable(TemplateType.SERVICE_IMPL);
            }
        }

        if (strategyVo.getMapper() != null) {
            if (StringUtils.isNotBlank(strategyVo.getMapper().getFileName())) {
                strategy.mapperBuilder().formatMapperFileName(strategyVo.getMapper().getFileName());
            }
            if (StringUtils.isNotBlank(strategyVo.getMapper().getPackageName())) {
                packageConfig.mapper(strategyVo.getMapper().getPackageName());
            }
            if (strategyVo.getMapper().isDisable()) {
                templateConfig.disable(TemplateType.MAPPER);
            }
        }
        if (strategyVo.getEntity() != null) {
            if (StringUtils.isNotBlank(strategyVo.getEntity().getFileName())) {
                strategy.entityBuilder().formatFileName(strategyVo.getEntity().getFileName());
            }
            if (StringUtils.isNotBlank(strategyVo.getEntity().getPackageName())) {
                packageConfig.entity(strategyVo.getEntity().getPackageName());
            }
            if (strategyVo.getEntity().isDisable()) {
                templateConfig.disable(TemplateType.ENTITY);
            }
        }
        if (strategyVo.getXml() != null) {
            if (StringUtils.isNotBlank(strategyVo.getXml().getPackageName())) {
                packageConfig.xml(strategyVo.getXml().getPackageName());
            }
            if (strategyVo.getXml().isDisable()) {
                templateConfig.disable(TemplateType.XML);
            }
        }

        if (strategyVo.getTablePrefixes() != null && strategyVo.getTablePrefixes().size() > 0) {
            strategy.addTablePrefix(strategyVo.getTablePrefixes());
        }
        if (strategyVo.getTables() != null && strategyVo.getTables().size() > 0) {
            strategy.addInclude(strategyVo.getTables());
        }
        mpg.template(templateConfig.build());
        mpg.packageInfo(packageConfig.build());
        mpg.strategy(strategy.build());
        mpg.execute();

        String zip = basePath + File.separator + datTime + ".zip";
        ZipUtil.zipCompress(basePath + File.separator + datTime, zip);

        return zip;
    }
}
